//
//  WBNetworkManager.swift
//  微博
//
//  Created by Mstarc on 2016/11/30.
//  Copyright © 2016年 Mstarc. All rights reserved.
//

import UIKit
import AFNetworking

//swift枚举支持任意数据类型
// switch / enum 在oc 中只支持整数

enum WBHTTPMethod {
    case GET
    case POST
 }
class WBNetworkManager: AFHTTPSessionManager {

    //静态区  /常量 / 闭包 
    //在第一次访问时执行闭包,并将结果保存在shared常量中
//    static let shared = WBNetworkManager()
    static let shared = { ()->WBNetworkManager in
        //实例化对象
        let  instance =  WBNetworkManager()
        //设置响应的反序列化的数据类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        return instance
        
    }
//    ///访问令牌 所有的网络请求 都基于此Token (登录除外)
//    var accessToken:String? //= "2.00vioORDeYUubB428f2beb10wLyR5E"
//    //用户的微博ID
//    var userid:String? = "12233"
//    
    
    //用户账户的懒加载属性
    lazy var userAccount = WBUserAccount()
    //用户登录标记,计算型属性
    var userLogin :Bool{
        return userAccount.access_token != nil
    }
    
    //专门负责拼接token的网络请求方法
    func tokenRequest(method:WBHTTPMethod = .GET,URLString: String,parameters:[String:Any]?,completion:@escaping ( _ json:Any?, _ isSuccess:Bool)->())  {
        //处理token字典
        //为了保护用户安全,token 是有时限的 默认三天
        //0>判断token是否为nil 为nil 直接返回
        guard let token = userAccount.access_token else {
            print("没有token")
            //FIXME :发送通知 ,提示用户登录
            completion(nil, false)
            return
        }
        //1>判断参数字典是否存在 如果为nil新建字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String : AnyObject]()
        }
        //2>设置参数字典
        parameters!["access_token"] = token
        //调取reques 发起真正的网络请求
        request(URLString: URLString, parameters: parameters!, completion: completion)
    }
    
    
    
    /// 使用一个函数封装 AFN的 GET POST 请求
    ///
    /// - parameter method:     GET /POST
    /// - parameter URLString:  URLString
    /// - parameter parameters: 参数字典
    /// - parameter completion: 完成回调[json(字典/数组) 是否成功]
    func request(method:WBHTTPMethod = .GET,URLString: String,parameters:[String:Any],completion:@escaping ( _ json:Any, _ isSuccess:Bool)->())  {
        
        //成功回调
        let success = {(task:URLSessionDataTask,json:Any)->() in
            completion(json , true)
        }
        //失败回调
        let failure = {(task:URLSessionDataTask?,error:Error)->() in

            //针对403  处理用户token过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token 过期了")
                //FIXME :发送通知,提示用户再次登录(本方法不知道被谁调用,谁接受到通知谁)
                
                
            }
            
            
            print("网络请求错误:\(error)")

            completion(error, false)
        }
        
    
        if method == .GET {
             get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }else{
       
        post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
}
